import store from "@/store"

const baseURL = 'https://smart-shop.itheima.net/index.php?s=/api' // 基础 URL

// 拦截器配置
const httpInterceptor = {
  // 拦截前触发（其实就是请求拦截器）
  // UniApp.RequestOptions 可以在 uni.request 的参数类型中看到，是一个包含了 url，data 等属性的对象接口
  invoke(options) {
    // 请求加载框
    uni.showLoading({title: '加载中'})

    // 1. 非 http 开头需拼接地址
    if (!options.url.startsWith('http')) {
      options.url = baseURL + options.url
    }
    // 2. 请求超时
    options.timeout = 5000
    // 3. 添加小程序端请求头标识
    options.header = {
      platform: 'H5',
      ...options.header, // 先执行 ...options.header, 再执行 options.header = {...}
    }
    // 4. 添加 token 请求头标识
    const token = store.getters.token
    if (token) options.header['Access-Token'] = token
  },
}

// 拦截 request 请求
uni.addInterceptor('request', httpInterceptor)

// 模拟 axios 请求封装
const axiosInstance = (options) => {
  return new Promise((resolve, reject) => {
    uni.request({
      ...options,
      success(res) {
        // 加载成功隐藏加载框
        uni.hideLoading()

        // 他这个很坑的，不管请求成功失败响应状态码都是 200，然后在数据中的 status 字段才是真正的请求失败还是成功的状态码
        if (res.data.status === 200) {
          resolve(res.data)
        } else {
          uni.showToast({
            icon: 'none',
            title: res.data?.message,
          })
          reject(res)
        }
      },
      fail(err) {
        // 加载失败也得隐藏加载框
        uni.hideLoading()

        uni.showToast({
          icon: 'none',
          title: '网络错误，换个网络试试',
        })
        reject(err)
      },
    })
  })
}

// 添加 get 方法
axiosInstance.get = (url, config = {}) => {
  const {
    params
  } = config
  return axiosInstance({
    method: 'GET',
    url,
    data: params,
  })
}

// 添加 post 方法
axiosInstance.post = (url, data) => {
  return axiosInstance({
    method: 'POST',
    url,
    data,
  })
}

// 导出实例，以便在其他文件中使用
export default axiosInstance
